package com.jsoft.controller;

import com.jsoft.constant.Constants;
import com.jsoft.core.RedisTemplate;
import com.jsoft.util.Result;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.utils.CaptchaUtil;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.UUID;


/**
 * 验证码生成类
 * <p>
 * 该类用于验证码生成
 */
@RestController
public class CaptchaController {
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 生成验证码
     * <p>
     * 使用 SpecCaptcha 类生成一个 130x48 像素的验证码，长度为 5。
     * 将验证码文本转换为小写，并使用 UUID 生成一个唯一的 key。
     * 使用 RedisUtil 将验证码文本存储到 Redis 中，并设置过期时间为 30 分钟。
     * 将 key 和 验证码图片的 base64 编码返回给前端。
     *
     * @throws IOException
     */
    @RequestMapping("/captcha")
    public Result captcha() throws IOException {

        SpecCaptcha specCaptcha = new SpecCaptcha(100, 35, 5);
        String verCode = specCaptcha.text().toLowerCase();
        String token = UUID.randomUUID().toString();
        String tokenKey = Constants.CAPTCHA_PREFIX + token;
        //存入redis设置过期时间
        redisTemplate.set(tokenKey, verCode, Constants.CAPTCHA_TIME);
        //设置验证码信息
        Map<String, Object> captchaMsg = new HashMap<>();
        captchaMsg.put("token", token);
        captchaMsg.put("image", specCaptcha.toBase64());
        //返回key和图片
        return Result.success(captchaMsg);

    }

    /**
     * 根据用户电话生成验证码
     *
     * @param userData 电话
     * @return 返回验证码
     */
    @RequestMapping("/phoneCaptcha")
    public Result phoneCaptcha(@RequestBody Map<String, String>userData) {

        Random random = new Random();
        // 生成一个 6 位的随机数
        int randomNum = 100000 + random.nextInt(900000);
        String phoneCaptcha = String.valueOf(randomNum);
        //生成token，将验证码存入redis
        String token = UUID.randomUUID().toString();
        String tokenKey = Constants.CAPTCHA_PREFIX + userData.get("phone") +":"+ token;//格式-》captcha:用户电话：token
        //存入redis设置过期时间
        redisTemplate.set(tokenKey, phoneCaptcha, Constants.CAPTCHA_TIME);
        //设置验证码信息
        Map<String, Object> captchaMsg = new HashMap<>();
        captchaMsg.put("token", token);
        captchaMsg.put("phoneCaptcha", phoneCaptcha);
        //返回验证码
        return Result.success(captchaMsg);


    }

}
